Skip to content

类的继承

Python 同样支持类的继承,如果一种语言不支持继承,类就没有什么意义。派生类的定义如下所示:

python
class <DerivedClassName>(<BaseClassName>):
	<statements>

子类(派生类 DerivedClassName)会继承父类(基类 BaseClassName)的属性和方法。

BaseClassName(实例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:

python
class <DerivedClassName>(<modname.BaseClassName>):
	<statements>

一般类在继承父类 BaseClassName 之后,还会增加一些自身新的属性和方法。

python
#类的定义
class Animal:
	name = 'animal'
	def talk(self):
		print('wow')
class Duck(Animal): #继承Animal类,拥有name属性和talk方法
	legs_count = 2
class Dog(Animal): #继承Animal类,拥有name属性和talk方法
	legs_count = 4
#类的实例化
duck = Duck()
dog = Dog()
print('duck legs count:', duck.legs_count) #输出2
print('dog legs count:', dog.legs_count) #输出4
duck.talk() #输出wow
dog.talk() #输出wow`

方法重写

如果父类 BaseClassName 满足不了子类的要求,还可以重新实现父类的方法,就是方法重写

python
#类的定义
class Animal:
	name = 'animal'
	def talk(self):
		print('wow')
class Duck(Animal): #继承Animal类,拥有name属性和talk方法
	legs_count = 2
	def talk(self): #覆盖Animal的talk方法
		print('gaga')
class Dog(Animal): #继承Animal类,拥有name属性和talk方法
	legs_count = 4
	def talk(self): #覆盖Animal的talk方法
		print('wang')
#类的实例化
duck = Duck()
dog = Dog()
duck.talk() #输出gaga
dog.talk() #输出wang`

项目式学习与应用

使用类的概念,构造出一个小游戏:

  • 游戏里有一个玩家和地图,玩家出生在地图的左上角。
  • 地图中有.#.代表可以通过的路径点,#代表不能通过的障碍点。
  • 玩家拥有姓名、能量值和生命值。
  • 通过输入 wasd 控制玩家上下左右移动。
  • 玩家每移动一步,减少 1 个能量值,如果移动到#障碍点,返回,并且生命值减 1。
  • 玩家能量值或者生命值为 0 时,玩家死亡,游戏结束。
  • 玩家如果到达右下角出口,胜利,游戏结束。
Player 类的定义
python
class Player:
    name = ''
    energy = 10
    pos = [0,0]
    hp = 3
    def __init__(self,name):
        self.name = name
    def setPos(self, row, col):
        self.pos[0] = row
        self.pos[1] = col
        self.energy -= 1
    def damage(self, point = -1):
        self.hp += point
Game 类的定义
python
class Game:
    player = Player('')
	#三个单引号可以实现多行字符串,用splitlines的方法,转换为列表
    grid = '''..###
#....
#.#.#
#.#.#
#.#..'''
    current_grid = []

    def __init__(self,name):
        self.player.name = name
        self.updateGrid()

    def updateGrid(self):
        self.current_grid = self.grid.splitlines()
        for i in range(len(self.current_grid)):
            self.current_grid[i] = list(self.current_grid[i])
        self.setPlayer(self.player.pos[0],self.player.pos[1])

    def setPlayer(self, row, col):
        self.current_grid[row][col] = 'P'

    def playerMove(self,row,col):
        if self.current_grid[row][col] == '#':
            self.player.damage(-1)
            if self.player.hp <= 0:
                print('Die')
                exit()
        else:
            self.player.setPos(row,col)

    def printGrid(self):
        print('Player:',self.player.name," energy:", self.player.energy," hp:",self.player.hp)
        for i in self.current_grid:
            for j in i:
                print(j,end='')
            print()

    def gameInput(self):
        move = input()
        row,col = self.player.pos
        if move == 'w':
            self.playerMove(row-1,col)
        elif move == 's':
            self.playerMove(row+1,col)
        elif move == 'a':
            self.playerMove(row,col-1)
        elif move == 'd':
            self.playerMove(row,col+1)
        self.updateGrid()

    def checkEnd(self):
        if self.player.pos[0] == len(self.current_grid) - 1 and self.player.pos[1] == len(self.current_grid[0]) - 1:
            print('Bingo')
            return True
        if self.player.energy <= 0:
            print('Die')
            return True
        return False
程序主体
python
name = input()
game = Game(name)
game.printGrid()
while True:
    game.gameInput()
    game.printGrid()
    if game.checkEnd():
        break